iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
Modern Web

讀官網文件邊走邊學nest.js系列 第 13

Day13- Interceptor in nest.js

  • 分享至 

  • xImage
  •  

除了middleware可以對原本request/response加工之外,nest.js提供interceptor可以對於程式要進入method之前與之後,執行一段程式或是對輸入輸出訊息做處理,稱之Aspect-Oriented Programming(AOP)

Interceptor必須實作NestInterceptor介面

interceptor方法傳入兩個引數ExecutionContext

  • ExecutionContext: 可以取得controller、及http相關資訊9(http context)
  • call$: 這部分比較抽象,簡單來說,call$就是回傳到client的response stream,如果interceptor沒有回傳call$,則等於是controller處理完後不會丟回response

以改變reponse內容為例,把原本的response內容再添加額外資訊

新增transformRes.interceoptor.ts


import { ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class TransformResInterceptor implements NestInterceptor { // 實作NestInterceptor介面
  intercept(
    context: ExecutionContext,
    call$: Observable<any>,
  ): Observable<any> {
    const controller = context.getClass().name; // 取得controller name
    const handler = context.getHandler().name; // 取得method name

    return call$.pipe(
      map(data => // 原response內容
        ({ // 改變response內容
          controller,
          handler,
          data,
        })),
    );
  }
}

在app.module.ts註冊interceptor

...
@Module({
  imports: [SharedModule],
  controllers: [AppController],
  providers: [
    AppService,
    AuthGuard,
    HttpExceptionFilter,
    TransformResInterceptor,
  ],
})
export class AppModule implements NestModule{
...

用@UseInterceptors套用TransformResInterceptor

app.controller.ts

...
@Controller()
@UseFilters(HttpExceptionFilter)
@UseGuards(AuthGuard)
@UseInterceptors(TransformResInterceptor)
export class AppController {
  redisClient: redis.RedisClient;
  constructor(private appService: AppService){
    // this.redisClient = redis.createClient(6379, 'redis-server');
    // this.redisClient.set('counter', '0');
  }
  
  @Get()
  sayHello(){
    return this.appService.sayHello();
  }

  @Post()
  @UsePipes(UserDTOValidationPipe)
  @ReflectMetadata('roles', ['admin', 'superuser'])
  create(@Body() userDTO: UserDTO){
    //throw new HttpException('糟糕!您的要求有問題,請洽系統管理員', HttpStatus.BAD_REQUEST);
    return `使用者:${userDTO.username}已建立`;
  }
  ...

使用postman測試


上一篇
Day12-Guard in nest.js(下)
下一篇
Day14-TypeORM(一)-連線設定
系列文
讀官網文件邊走邊學nest.js31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言